Приложения Windows могут совместно использовать код, а также состояние приложения и компонента в реестре, специфические для приложения данные в файловой системе и функции Windows API, работающие с глобальными пространствами имен. При совместном использовании учитываются ограниченные аппаратные ресурсы и уменьшается объем тестирования для групп Проверки качества.
Однако совместное использование обладает и недостатками. Совместное использование делает приложения зависимыми друг от друга, что отражается на надежности. В крайнем случае, ранее работавшие приложения могут работать непредсказуемо или даже привести к сбою. Обычно приложение использует определенную версию или реализацию совместно используемого компонента. Если версия совместно используемого компонента повышается (или понижается) в результате установки другого приложения, это может привести к нарушению работы ранее установленного приложения. Это состояние называется «DLL Hell.» (Ад динамических библиотек)
Для успешного глобального совместного использования необходимо, чтобы все совместно используемые компоненты вели себя точно так же, как и их предыдущие версии. Однако на практике трудно, а иногда невозможно, достичь 100%-ой совместимости с предыдущими версиями, поскольку:
Обычно невозможно протестировать все конфигурации, в которых может использоваться компонент.
«Функциональность» компонента довольно сложно определить. Приложения могут становиться зависимыми от непредусмотренных побочных эффектов, которые не являются частью «функциональности» ядра компонента. Например, автор компонента может устранить в компоненте ошибку, от которой преднамеренно или случайно зависело другое приложение.
Большое количество программ, использующих такой компонент, дополнительно обостряет проблему.
В Windows 2000 и Windows 98 Second Edition предлагается новая форма совместного использования, называемая смежным совместным использованием, которая повышает надежность приложения. Смежное совместное использование позволяет нескольким версиям одного и того же компонента COM или Win32 одновременно работать в памяти. Это означает, что приложения могут использовать специфические компоненты, для которых они разработаны и протестированы, даже если для другого приложения необходима другая версия того же компонента. Это позволяет разработчикам создавать более надежные приложения, поскольку они могут выбирать версию компонента для своего приложения независимо от прочих приложений в системе.
Для смежного совместного использования необходимо использование смежных компонентов, которые представляют собой обычные компоненты COM или Win32, за тем исключением, что они:
Устанавливаются в каталог приложения, а не в системный каталог.
Должны быть корректно зарегистрированы в системе (как описано далее в этой главе), чтобы не конфликтовать с другими версиями компонентов, которые могут быть установлены.
Смежные компоненты выделяются в отдельные приложения и не используются глобально всеми приложениями:
Смежные компоненты могут благополучно работать смежно с другими версиями того же самого компонента, установленного в системе. Если другому приложению в системе необходима иная версия компонента, это не коснется Вашего приложение, и оба приложения будут работать с собственными версиями компонента.
Если какое-либо приложение установит в системе более новую версию компонента, Ваша версия этого компонента останется нетронутой, поскольку она установлена в каталоге Вашего приложения. Ваше приложение будет по-прежнему использовать ту же версию компонента, которая была установлена вместе с ним, в то время как другое приложение будет использовать собственную версию компонента. Обе версии могут находиться в памяти одновременно.
В следующей таблице проводится сравнение традиционного метода «глобального совместного использования» со смежным совестным использованием.
Глобальное совместное использование | Смежное совместное использование |
Необходима временная последовательность в интерфейсе и поведении. Нужно тестировать совместимость с предыдущими версиями. | Интерфейс и поведение могут меняться со временем. |
Все версии могут/должны использовать одно и тоже состояние. (Реестр и пр.) | Необходима изоляция состояния компонента по его версии, и (необязательно) по приложению, использующему этот компонент. |
Все приложения используют «самую последнюю версию» компонента. | Приложения выбирают, какую версию компонента они должны использовать. |
Устанавливается в глобальный каталог, например, в системный. | Устанавливается в каталог приложения. |
Активация по абсолютному имени (имени файла в системном каталоге или полному пути к файлу). | Активация по относительному имени в зависимости от запущенного приложения. |
Для обновления/устранения ошибок в работе компонента необходимо просто заменить единственный совместно используемый компонент. | Обновление и устранение ошибок в работе компонента становится заботой разработчика приложения. |